/**
 * JS модель Задачи
 * Содержит все необходимые атрибуты
 * @param {type} params
 * @returns {undefined}
 */
function Issue(params){
	params = params || {};
	var self = this;

	// Хранимые свойства задачи
	self.id = ko.observable(params.id || null);
	self.name = ko.observable(params.name || null);
	self.status = ko.observable(null);
	self.statusName = ko.computed(function(){
		return self.status() !== null ? self.status().name() : 'Статус не задан';
	});
	self.type = ko.observable(null);
	self.typeName = ko.computed(function(){
		return self.type() !== null ? self.type().name() : 'Тип не задан';
	});
	self.description = ko.observable(params.description || '');
	self.is_rejected = ko.observable(params.is_rejected || 0);
	self.setRejected = function(){
		self.is_rejected(1);
	};
	self.setNotRejected = function(){
		self.is_rejected(0);
	};
	self.is_special = ko.observable(parseInt(params.is_special) || 0);
	self.is_special.subscribe(function(){
		all.issues.valueHasMutated();
	});
	self.estimate = ko.observable(parseFloat(params.estimate) || 0);
	self.priority = ko.observable(null);
	self.priority.subscribe(function(){
		all.issues.valueHasMutated();
	})
	self.priorityClass = ko.computed(function(){
		return self.priority() !== null ? self.priority().class : '';
	});
	// Связные данные
	self.chunk = ko.observable(null);
	self.chunk.subscribe(function(){
		all.issues.valueHasMutated();
	});
	self.chunkName = ko.computed(function(){
		return self.chunk() !== null ? self.chunk().name() : 'Этап не задан';
	});
	self.project = ko.observable(null);
	self.projectName = ko.computed(function(){
		return self.project() !== null ? self.project().name() : 'Проект не задан';
	});
	self.assignee = ko.observable(null);
	self.assignee.subscribe(function(){
		all.issues.valueHasMutated();
	});
	
	// Список url-адресов
	self.urls = ko.computed(function(){
		return {
			create: '/api/issue/create',
			update: '/api/issue/update/id/' + self.id(),
			delete: '/api/issue/delete/id/' + self.id()
		};
	});
	// Возвращает объект данных для запроса
	// на создание/обновление объекта в БД
	self.getRequestData = function(){
		var data = {};
		if(!self.id() !== null){
			data.id = self.id();
		}
		data.name = self.name();
		data.description = self.description();
		data.estimate = self.estimate();
		data.priority = all.issuePriorities.indexOf(self.priority());
		data.is_rejected = self.is_rejected();
		data.is_special = self.is_special();
		
		if(self.status() !== null){
			data.status = self.status().id();
		}
		else{
			data.status = all.issueStatuses()[0].id();
		}
		
		if(self.type() !== null){
			data.type = self.type().id();
		}
		else{
			data.type = all.issueTypes()[0].id();
		}
		
		if(self.chunk() !== null){
			data.id_chunk = self.chunk().id();
		}
		else{
			data.id_chunk = null;
		}
		
		if(self.project() !== null){
			data.id_project = self.project().id();
		}
		
		if(self.assignee() !== null){
			data.id_user_assignee = self.assignee().id();
		}
		else{
			data.id_user_assignee = null;
		}
		
		return {Issue:data};
	};
	// Проверяет, является ли задача нераспределенной
	self.isUnscheduled = ko.computed(function(){
		return self.chunk() === null;
	});
	// Проверяет, является ли задача отклоненной
	self.isRejected = ko.computed(function(){
		return self.is_rejected() == 1;
	});
	// Открытая задача
	self.isOpen = ko.computed(function(){
		return self.status() !== null 
			&& (self.status().id() == IssueStatus.STATUS_OPEN || self.status().id() == IssueStatus.STATUS_IN_PROGRESS);
	});
	self.isOpen.subscribe(function(){
		all.issues.valueHasMutated();
	});
	// Решенная задача
	self.isResolved = ko.computed(function(){
		return self.status() !== null && self.status().id() == IssueStatus.STATUS_RESOLVED;
	});
	self.isResolved.subscribe(function(){
		all.issues.valueHasMutated();
	});
	// Выполненная задача
	self.isVerified = ko.computed(function(){
		return self.status() !== null && self.status().id() == IssueStatus.STATUS_VERIFIED;
	});
	self.isVerified.subscribe(function(){
		all.issues.valueHasMutated();
	});
	// Установка приоритетов
	self.setPriority = function(priority){
		self.priority(priority);
		self.update();
	};
	// Установка/снятие флага "Особая"
	self.toggleSpecial = function(){
		self.is_special(Math.abs(self.is_special() - 1));
		self.update();
	};
	
	// Расширяем функционал модели общими методами (см. /js/models/model.js)
	_extend(self);
}